from collections import defaultdict
import time
import openai
from tool import get_completion_from_messages
import json

def get_products():
    with open('./products.json', 'r', encoding='utf-8') as file:
        products = json.load(file)
    return products

def read_string_to_list(input_string):
    """
    将输入的字符串转换为 Python 列表。
    参数:
    input_string: 输入的字符串，应为有效的 JSON 格式。
    返回:
    list 或 None: 如果输入字符串有效，则返回对应的 Python 列表，否则返回 None。
    """
    if input_string is None:
        return None
    try:
        # 将输入字符串中的单引号替换为双引号，以满足 JSON 格式的要求
        input_string = input_string.replace("'", "\"")
        data = json.loads(input_string)
        return data
    except json.JSONDecodeError:
        print("Error: Invalid JSON string")
        return None


# 获取商品和目录
def get_products_and_category():
    """
    具体原理参见第五节课
    """
    products = get_products()
    products_by_category = defaultdict(list)
    for product_name, product_info in products.items():
        category = product_info.get('category')
        if category:
            products_by_category[category].append(product_info.get('name'))

    return dict(products_by_category)


# 从问题中抽取商品
def get_products_from_query(user_msg):
    """
    代码来自于第五节课
    """
    products_and_category = get_products_and_category()
    delimiter = "####"
    system_message = f"""
    您将获得客户服务查询。
    客户服务查询将使用{delimiter}字符作为分隔符。
    请仅输出一个可解析的Python列表，列表每一个元素是一个JSON对象，每个对象具有以下格式：
    'category': <包括以下几个类别：Computers and Laptops、Smartphones and Accessories、Televisions and Home Theater Systems、Gaming Consoles and Accessories、Audio Equipment、Cameras and Camcorders>,
    以及
    'products': <必须是下面的允许产品列表中找到的产品列表>

    类别和产品必须在客户服务查询中找到。
    如果提到了某个产品，它必须与允许产品列表中的正确类别关联。
    如果未找到任何产品或类别，则输出一个空列表。
    除了列表外，不要输出其他任何信息！

    允许的产品以JSON格式提供。
    每个项目的键表示类别。
    每个项目的值是该类别中的产品列表。

    以下是允许的产品：{products_and_category}

    """

    messages = [
        {'role': 'system', 'content': system_message},
        {'role': 'user', 'content': f"{delimiter}{user_msg}{delimiter}"},
    ]
    category_and_product_response = get_completion_from_messages(messages)

    return category_and_product_response

# 商品信息的搜索
def get_product_by_name(name):
    products = get_products()
    return products.get(name, None)

def get_products_by_category(category):
    products = get_products()
    return [product for product in products.values() if product["category"] == category]

def get_mentioned_product_info(data_list):
    """
    具体原理参见第五、六节课
    """
    product_info_l = []

    if data_list is None:
        return product_info_l

    for data in data_list:
        try:
            if "products" in data:
                products_list = data["products"]
                for product_name in products_list:
                    product = get_product_by_name(product_name)
                    if product:
                        product_info_l.append(product)
                    else:
                        print(f"错误: 商品 '{product_name}' 未找到")
            elif "category" in data:
                category_name = data["category"]
                category_products = get_products_by_category(category_name)
                for product in category_products:
                    product_info_l.append(product)
            else:
                print("错误：非法的商品格式")
        except Exception as e:
            print(f"Error: {e}")

    return product_info_l

# Example usage:
#product_information_for_user_message_1 = generate_output_string(category_and_product_list)
#print(product_information_for_user_message_1)
# 回答用户问题
def answer_user_msg(user_msg,product_info):
    """
    代码参见第五节课
    """
    delimiter = "####"
    system_message = f"""
    您是一家大型电子商店的客户服务助理。\
    请用友好和乐于助人的口吻回答问题，提供简洁明了的答案。\
    确保向用户提出相关的后续问题。
    """
    # user_msg = f"""
    # tell me about the smartx pro phone and the fotosnap camera, the dslr one. Also what tell me about your tvs"""
    messages =  [
    {'role':'system', 'content': system_message},
    {'role':'user', 'content': f"{delimiter}{user_msg}{delimiter}"},
    {'role':'assistant', 'content': f"相关产品信息:\n{product_info}"},
    ]
    response = get_completion_from_messages(messages)
    return response

if __name__ == '__main__':
    # 用户消息
    customer_msg = f"""
    告诉我有关 the smartx pro phone 和 the fotosnap camera, the dslr one 的信息。
    另外，你们这有什么 TVs ？"""
    # 从问题中抽取商品名
    products_by_category = get_products_from_query(customer_msg)
    # 将商品名转化为列表
    category_and_product_list = read_string_to_list(products_by_category)
    # 查找商品对应的信息
    product_info = get_mentioned_product_info(category_and_product_list)
    # 由信息生成回答
    assistant_answer = answer_user_msg(user_msg=customer_msg,
                                                product_info=product_info)
    print(assistant_answer)